home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / OWLINC.PAK / LISTBOX.H < prev    next >
C/C++ Source or Header  |  1997-05-06  |  13KB  |  441 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1991, 1997 by Borland International, All Rights Reserved
  4. //
  5. //$Revision:   10.6  $
  6. //
  7. // Definition of class TListBox and TlistBoxData.  This defines the basic
  8. // behavior of all list box controls.
  9. //----------------------------------------------------------------------------
  10. #if !defined(OWL_LISTBOX_H)
  11. #define OWL_LISTBOX_H
  12.  
  13. #if !defined(OWL_CONTROL_H)
  14. # include <owl/control.h>
  15. #endif
  16. #if !defined(OWL_CONTAIN_H)
  17. # include <owl/contain.h>
  18. #endif
  19.  
  20. #if defined(BI_NAMESPACE)
  21. namespace OWL {
  22. #endif
  23.  
  24. // Generic definitions/compiler options (eg. alignment) preceeding the
  25. // definition of classes
  26. #include <services/preclass.h>
  27.  
  28. //
  29. // class TListBox
  30. // ~~~~~ ~~~~~~~~
  31. class _OWLCLASS TListBox : public TControl {
  32.   public:
  33.     TListBox(TWindow*        parent,
  34.              int             id,
  35.              int x, int y, int w, int h,
  36.              TModule*        module = 0);
  37.  
  38.     TListBox(TWindow* parent, int resourceId, TModule*   module = 0);
  39.  
  40.     // List box attributes
  41.     //
  42.     virtual int   GetCount() const;
  43.     virtual int   FindString(const char far* str, int index) const;
  44.     int           FindExactString(const char far* str, int searchIndex) const;
  45.     virtual int   GetTopIndex() const;
  46.     virtual int   SetTopIndex(int index);
  47.     bool          SetTabStops(int numTabs, int far* tabs);
  48.  
  49.     virtual int   GetHorizontalExtent() const;
  50.     virtual void  SetHorizontalExtent(int horzExtent);
  51.     void          SetColumnWidth(int width);
  52.     int           GetCaretIndex() const;
  53.     int           SetCaretIndex(int index, bool partScrollOk);
  54.  
  55.     // Query individual list items
  56.     //
  57.     virtual int   GetStringLen(int index) const;
  58.     virtual int   GetString(char far* str, int index) const;
  59.     virtual uint32 GetItemData(int index) const;
  60.     virtual int   SetItemData(int index, uint32 itemData);
  61.  
  62.     int           GetItemRect(int index, TRect& rect) const;
  63.     virtual int   GetItemHeight(int index) const;
  64.     virtual int   SetItemHeight(int index, int height);
  65.  
  66.     // Operations on the list box itself
  67.     //
  68.     virtual void  ClearList();
  69.     virtual int   DirectoryList(uint attrs, const char far* fileSpec);
  70.  
  71.     // Operations on individual list box items
  72.     //
  73.     virtual int   AddString(const char far* str);
  74.     virtual int   InsertString(const char far* str, int index);
  75.     virtual int   DeleteString(int index);
  76.  
  77.     // Single selection list boxes only (combos overload these)
  78.     //
  79.     virtual int   GetSelIndex() const;
  80.     virtual int   SetSelIndex(int index);
  81.             int   GetSelString(char far* str, int maxChars) const;
  82.             int   SetSelString(const char far* str, int searchIndex);
  83.  
  84.     // Multiple selection list boxes only
  85.     //
  86.     int           GetSelCount() const;
  87.     int           GetSelStrings(char far** strs, int maxCount,
  88.                                 int maxChars) const;
  89.     int           SetSelStrings(const char far** prefixes, int numSelections,
  90.                                 bool shouldSet);
  91.     int           GetSelIndexes(int* indexes, int maxCount) const;
  92.     int           SetSelIndexes(int* indexes, int numSelections, bool shouldSet);
  93.     bool          GetSel(int index) const;
  94.     int           SetSel(int index, bool select);
  95.     int           SetSelItemRange(bool select, int first, int last);
  96.  
  97. #if defined(BI_PLAT_WIN32)
  98.     uint32        ItemFromPoint(TPoint& p);
  99.     int           InitStorage(int numItemsToAdd, uint32 memoryToAllocate);
  100.  
  101.     // Multiple Selection List boxes only
  102.     // 
  103.     int           GetAnchorIndex() const;
  104.     int           SetAnchorIndex(int index);
  105. #endif
  106.  
  107.     // Override TWindow virtual member functions
  108.     //
  109.     uint          Transfer(void* buffer, TTransferDirection direction);
  110.  
  111.   protected:
  112.     // Override TWindow virtual member functions
  113.     //
  114.     char far*     GetClassName();
  115.  
  116.   private:
  117.     // Hidden to prevent accidental copying or assignment
  118.     //
  119.     TListBox(const TListBox&);
  120.     TListBox& operator =(const TListBox&);
  121.  
  122.   DECLARE_STREAMABLE(_OWLCLASS, TListBox, 1);
  123. };
  124.  
  125. //
  126. // List box notification macros. methods are: void method()
  127. //
  128. // EV_LBN_DBLCLK(id, method)
  129. // EV_LBN_ERRSPACE(id, method)
  130. // EV_LBN_KILLFOCUS(id, method)
  131. // EV_LBN_SELCANCEL(id, method)
  132. // EV_LBN_SELCHANGE(id, method)
  133. // EV_LBN_SETFOCUS(id, method)
  134.  
  135. //
  136. // class TListBoxData
  137. // ~~~~~ ~~~~~~~~~~~~
  138. class _OWLCLASS TListBoxData {
  139.   public:
  140.     TListBoxData();
  141.    ~TListBoxData();
  142.  
  143.     TStringArray&   GetStrings();
  144.     TUint32Array&   GetItemDatas();
  145.     TIntArray&      GetSelIndices();
  146.  
  147.     void    AddString(const char* str, bool isSelected = false);
  148.     void    AddStringItem(const char* str, uint32 itemData, bool isSelected = false);
  149.     void    Clear();
  150.  
  151.     void    Select(int index);
  152.     void    SelectString(const char far* str);
  153.     int     GetSelCount() const;
  154.     void    ResetSelections();
  155.     int     GetSelStringLength(int index = 0) const;
  156.     void    GetSelString(char far* buffer, int bufferSize, int index=0) const;
  157.     void    GetSelString(string& str, int index=0) const;
  158.  
  159.   protected_data:
  160.     TStringArray  Strings;     // Contains all strings in listbox
  161.     TUint32Array  ItemDatas;   // Contains all uint32 item datas in listbox
  162.     TIntArray     SelIndices;  // Contains all selection indices
  163. };
  164.  
  165. // Generic definitions/compiler options (eg. alignment) following the
  166. // definition of classes
  167. #include <services/posclass.h>
  168.  
  169. #if defined(BI_NAMESPACE)
  170. } // namespace OWL
  171. #endif
  172.  
  173. // --------------------------------------------------------------------------
  174. // Inline implementations
  175. //
  176.  
  177. //
  178. inline int TListBox::GetTopIndex() const {
  179.   PRECONDITION(GetHandle());
  180.   return (int)CONST_CAST(TListBox*,this)->SendMessage(LB_GETTOPINDEX);
  181. }
  182.  
  183. //
  184. inline int TListBox::SetTopIndex(int index) {
  185.   PRECONDITION(GetHandle());
  186.   return (int)SendMessage(LB_SETTOPINDEX, index);
  187. }
  188.  
  189. //
  190. inline bool TListBox::SetTabStops(int numTabs, int far* tabs) {
  191.   PRECONDITION(GetHandle());
  192.   return (bool)SendMessage(LB_SETTABSTOPS, numTabs, TParam2(tabs));
  193. }
  194.  
  195. //
  196. inline int TListBox::GetHorizontalExtent() const {
  197.   PRECONDITION(GetHandle());
  198.   return (int)CONST_CAST(TListBox*,this)->SendMessage(LB_GETHORIZONTALEXTENT);
  199. }
  200.  
  201. //
  202. inline void TListBox::SetHorizontalExtent(int horzExtent) {
  203.   PRECONDITION(GetHandle());
  204.   SendMessage(LB_SETHORIZONTALEXTENT, horzExtent);
  205. }
  206.  
  207. //
  208. inline void TListBox::SetColumnWidth(int width) {
  209.   PRECONDITION(GetHandle());
  210.   SendMessage(LB_SETCOLUMNWIDTH, width);
  211. }
  212.  
  213. //
  214. inline int TListBox::GetCaretIndex() const {
  215.   PRECONDITION(GetHandle());
  216.   return (int)CONST_CAST(TListBox*,this)->SendMessage(LB_GETCARETINDEX);
  217. }
  218.  
  219. //
  220. inline int TListBox::SetCaretIndex(int index, bool partScrollOk) {
  221.   PRECONDITION(GetHandle());
  222.   return (int)SendMessage(LB_SETCARETINDEX, index, MkParam2(partScrollOk,0));
  223. }
  224.  
  225. //
  226. inline uint32 TListBox::GetItemData(int index) const {
  227.   PRECONDITION(GetHandle());
  228.   return CONST_CAST(TListBox*,this)->SendMessage(LB_GETITEMDATA, index);
  229. }
  230.  
  231. //
  232. inline int TListBox::SetItemData(int index, uint32 itemData) {
  233.   PRECONDITION(GetHandle());
  234.   return (int)SendMessage(LB_SETITEMDATA, index, itemData);
  235. }
  236.  
  237. //
  238. inline int TListBox::GetItemRect(int index, TRect& rect) const {
  239.   PRECONDITION(GetHandle());
  240.   return (int)CONST_CAST(TListBox*,this)->
  241.            SendMessage(LB_GETITEMRECT, index, TParam2((TRect FAR*)&rect));
  242. }
  243.  
  244. //
  245. inline int TListBox::GetItemHeight(int index) const {
  246.   PRECONDITION(GetHandle());
  247.   return (int)CONST_CAST(TListBox*,this)->
  248.            SendMessage(LB_GETITEMHEIGHT, index);
  249. }
  250.  
  251. //
  252. inline int TListBox::SetItemHeight(int index, int height) {
  253.   PRECONDITION(GetHandle());
  254.   return (int)SendMessage(LB_SETITEMHEIGHT, index, MkParam2(height, 0));
  255. }
  256.  
  257. //
  258. inline int TListBox::DirectoryList(uint attrs, const char far* fileSpec) {
  259.   PRECONDITION(GetHandle());
  260.   return (int)SendMessage(LB_DIR, attrs, TParam2(fileSpec));
  261. }
  262.  
  263. //
  264. // Adds a string to an associated listbox
  265. // Returns index of the string in the list(the first entry is at index 0),
  266. // a negative if an error occurs.
  267. //
  268. inline int TListBox::AddString(const char far* str) {
  269.   PRECONDITION(GetHandle());
  270.   return (int)SendMessage(LB_ADDSTRING, 0, TParam2(str));
  271. }
  272.  
  273. //
  274. // Inserts a string in the associated listbox at the passed index,
  275. // returns the index of the string in the list, a negative if an error occurs
  276. //
  277. inline int TListBox::InsertString(const char far* str, int index) {
  278.   PRECONDITION(GetHandle());
  279.   return (int)SendMessage(LB_INSERTSTRING, index, TParam2(str));
  280. }
  281.  
  282. //
  283. // Deletes the string at the passed index in the associated listbox
  284. // Returns a count of the entries remaining in the list, a negative
  285. // value if an error occurs
  286. //
  287. inline int TListBox::DeleteString(int index) {
  288.   PRECONDITION(GetHandle());
  289.   return (int)SendMessage(LB_DELETESTRING, index);
  290. }
  291.  
  292. //
  293. // Clears all the entries in the associated listbox
  294. //
  295. inline void TListBox::ClearList() {
  296.   PRECONDITION(GetHandle());
  297.   SendMessage(LB_RESETCONTENT);
  298. }
  299.  
  300. //
  301. // Returns the number of entries in the associated listbox, a negative
  302. // value if an error occurs
  303. //
  304. //
  305. inline int TListBox::GetCount() const {
  306.   PRECONDITION(GetHandle());
  307.   return (int)CONST_CAST(TListBox*,this)->SendMessage(LB_GETCOUNT);
  308. }
  309.  
  310. //
  311. // Returns the index of the first string in the associated listbox which
  312. // begins with the passed string
  313. //
  314. // Searches for a match beginning at the passed SearchIndex. If a match is
  315. // not found after the last string has been compared, the search continues
  316. // from the beginning of the list until a match is found or until the list
  317. // has been completely traversed
  318. //
  319. // Searches from beginning of list when -1 is passed as the index
  320. //
  321. // Returns the index of the selected string, a negative if an error occurs
  322. //
  323. inline int TListBox::FindString(const char far* find, int indexStart) const {
  324.   PRECONDITION(GetHandle());
  325.   return (int)CONST_CAST(TListBox*,this)->
  326.            SendMessage(LB_FINDSTRING, indexStart, TParam2(find));
  327. }
  328.  
  329. //
  330. // Retrieves the contents of the string at the passed index of the
  331. // associated listbox. Returns the length of the string (in bytes
  332. // excluding the terminating 0),  a negative if the passed index is not valid
  333. //
  334. // The buffer must be large enough for the string and the terminating 0
  335. //
  336. inline int TListBox::GetString(char far* str, int index) const {
  337.   PRECONDITION(GetHandle());
  338.   return (int)CONST_CAST(TListBox*,this)->
  339.            SendMessage(LB_GETTEXT, index, TParam2(str));
  340. }
  341.  
  342. //
  343. // Returns the length of the string at the passed index in the associated
  344. // listbox excluding the terminating 0, a negative if an error occurs
  345. //
  346. inline int TListBox::GetStringLen(int index) const {
  347.   PRECONDITION(GetHandle());
  348.   return (int)CONST_CAST(TListBox*,this)->SendMessage(LB_GETTEXTLEN, index);
  349. }
  350.  
  351. //
  352. // Get the selection state (true/false) of a particular item at 'index'
  353. //
  354. inline bool TListBox::GetSel(int index) const {
  355.   PRECONDITION(GetHandle());
  356.   return (bool)CONST_CAST(TListBox*,this)->SendMessage(LB_GETSEL, index);
  357. }
  358.  
  359. //
  360. // Set the selection state (true/false) of a particular item at 'index',
  361. // or all items if index is -1
  362. //
  363. //
  364. inline int TListBox::SetSel(int index, bool select) {
  365.   PRECONDITION(GetHandle());
  366.   return (int)SendMessage(LB_SETSEL, select, MkParam2(index, 0));
  367. }
  368.  
  369. //
  370. inline int TListBox::SetSelItemRange(bool select, int first, int last) {
  371.   PRECONDITION(GetHandle());
  372.   return (int)SendMessage(LB_SELITEMRANGE, select, MkParam2(first, last));
  373. }
  374.  
  375. #if defined(BI_PLAT_WIN32)
  376. //
  377. inline uint32 TListBox::ItemFromPoint(TPoint& p)
  378. {
  379.   PRECONDITION(GetHandle());
  380.   return (uint32)SendMessage(LB_ITEMFROMPOINT, 0, MkParam2(p.x, p.y));
  381. }
  382.  
  383. //
  384. inline int TListBox::InitStorage(int numItemsToAdd, uint32 memoryToAllocate)
  385. {
  386.   PRECONDITION(GetHandle());
  387.   return (int)SendMessage(LB_INITSTORAGE, numItemsToAdd, memoryToAllocate);
  388. }
  389.  
  390. //
  391. // Gets\Sets the index of the "anchor" item in a multiple selection listbox.
  392. // The anchor item is where a multiple selection starts. 
  393. //
  394. inline int TListBox::GetAnchorIndex() const
  395. {
  396.   PRECONDITION(GetHandle());
  397.   return (int)CONST_CAST(TListBox*,this)->SendMessage(LB_GETANCHORINDEX, 0, 0);
  398. }
  399.  
  400. //
  401. inline int TListBox::SetAnchorIndex(int index)
  402. {
  403.   PRECONDITION(GetHandle());
  404.   return (int)SendMessage(LB_SETANCHORINDEX, index, 0);
  405. }
  406. #endif
  407.  
  408. //
  409. inline TStringArray& TListBoxData::GetStrings() {
  410.   return Strings;
  411. }
  412.  
  413. //
  414. inline TUint32Array& TListBoxData::GetItemDatas() {
  415.   return ItemDatas;
  416. }
  417.  
  418. //
  419. inline TIntArray& TListBoxData::GetSelIndices() {
  420.   return SelIndices;
  421. }
  422.  
  423. //
  424. inline void TListBoxData::Clear() {
  425.   Strings.Flush();
  426.   ItemDatas.Flush();
  427.   ResetSelections();
  428. }
  429.  
  430. //
  431. inline int TListBoxData::GetSelCount() const {
  432.   return SelIndices.GetItemsInContainer();
  433. }
  434.  
  435. //
  436. inline void TListBoxData::ResetSelections() {
  437.   SelIndices.Flush();
  438. }
  439.  
  440. #endif  // OWL_LISTBOX_H
  441.